package com.aote.entity;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;

import com.browsesoft.Tools;

/**
 * 实体类型工厂，给实体管理器提供实体类型
 */
public class EntityTypeFactory {
	static private EntityTypeFactory instance = new EntityTypeFactory();

	/**
	 * 存放实体类型，对应的java类，以及数据库表，数据库表结构的对应关系
	 */
	private Map entities = new HashMap();

	private EntityTypeFactory() {
	}

	static public EntityTypeFactory getInstance() {
		return instance;
	}

	/**
	 * 根据表名找到所对应的类名
	 */
	public String getClassNameByTableName(String tablename) {
		// 得到所有属性文件中的属性
		Iterator iter = this.entities.values().iterator();
		while (iter.hasNext()) {
			EntityType type = (EntityType) iter.next();
			// 得到表名
			String tbname = (String) type.getTableName();
			// 如果表名相同
			if (tbname.equals(tablename)) {
				// 返回类名
				return (String) type.getClassName();
			}
		}
		return null;
	}

	/**
	 * 根据类名找到所有对应的表
	 */
	public Iterator getTableNamesByClassName(String classname) {
		Collection result = new HashSet();
		// 得到所有属性文件中的属性
		Iterator iter = this.entities.values().iterator();
		while (iter.hasNext()) {
			EntityType type = (EntityType) iter.next();
			// 得到类名
			String cn = (String) type.getClassName();
			// 如果类名相同并且是延迟加载
			if (cn.equals(classname) && type.isLazy()) {
				result.add(type.getTableName());
			}
		}
		return result.iterator();
	}

	/**
	 * 根据实体类型名得到实体类型
	 * 
	 * @param typeName
	 *            实体类型名
	 * @return 实体类型
	 */
	public EntityType getEntityType(String typeName) {
		EntityType result = (EntityType) this.entities.get(typeName);
		// 如果没有得到
		if (result == null) {
			// 显示实体类型不存在错误
			throw new EntityTypeNotFoundException(typeName);
		}
		return result;
	}
	
	/**
	 * 看实体类型存在不
	 */
	public boolean contains(String type) {
		return this.entities.containsKey(type);
	}

	/**
	 * 根据元素往工厂添加实体类型描述，用于属性文件描述
	 */
	public void addEntities(String table, String className, String types,
			String lazy) {
		// 把实体与类以及表的对应关系记录下来
		Map map = this.getEntityTypes(table, className, types, lazy
				.equals("isLazy"));
		this.entities.putAll(map);
	}

	/**
	 * 根据输入的以","分割的实体类型串，生成实体与java类及数据库的映射关系表
	 * 
	 * @param tableName
	 *            数据库表名
	 * @param className
	 *            java类名
	 * @param entityTypes
	 *            以","分割的实体类型串
	 * @param isLazy
	 *            是否延迟加载
	 * @return 映射关系表
	 */
	private Map getEntityTypes(String tableName, String className,
			String entityTypes, boolean isLazy) {
		Map result = new HashMap();
		// 对于每一个实体类型
		Iterator iter = Tools.stringToLinkedList(entityTypes).iterator();
		while (iter.hasNext()) {
			String item = (String) iter.next();
			EntityType type = new EntityType(item, className, tableName, isLazy);
			// 构造实体对应关系，放入结果中
			result.put(item, type);
		}
		return result;
	}

}
